package cn.jzq.utils;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;

/**
 * 表单重复提交校验
 * 		在第一次访问页面时生成令牌，并set进session中
 * 		在jsp页面设置隐藏域，用于设置令牌
 * 
 * 在服务器端生成一个唯一的随机标识号，专业术语称为Token(令牌)，同时在当前用户的
 * Session域中保存这个Token 然后将Token发送到客户端的Form表单中，在Form表单中使
 * 用隐藏域来存储这个Token，表单提交的时候连同这个Token一起提交到服务器端，
 * 然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致，如果不一致，那就是重复提交了，
 * 此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交，
 * 处理完后清除当前用户的Session域中存储的标识号。
 *
 * @author 蒋正强
 *
 * @author 孤傲苍狼	http://www.cnblogs.com/xdp-gacl/p/3859416.html
 * 
 * @version v1.1 2017/07/04
 */
public class SubmitCheck
{

	/**
	 * 判断客户端提交上来的令牌和服务器端生成的令牌是否一致
	 * 
	 * @param request
	 * @return true 用户重复提交了表单 false 用户没有重复提交表单
	 */
	public static boolean isRepeatSubmit(HttpServletRequest request)
	{
		// 表单提交的令牌
		String client_token = request.getParameter("token");
		
		// 1、如果用户提交的表单数据中没有token，则用户是重复提交了表单
		if (client_token == null)
		{
			return true;
		}
		// 2、如果当前用户的Session中不存在Token(令牌)，则用户是重复提交了表单
		String server_token = (String) request.getSession().getAttribute("token");
		if (server_token == null)
		{
			return true;
		}
		// 3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同，则用户是重复提交了表单
		if (!client_token.equals(server_token) && StringUtils.isNotBlank(client_token))
		{
			return true;
		}
		
		request.getSession().setAttribute("token", DateUtil.getNo(3));	// 更新令牌

		return false;
	}

}